package com.thp.proxy.jdk;


import java.io.FileOutputStream;

import sun.misc.ProxyGenerator;

public class TestFindLove {
	
	// 主运行的方法
	public static void main(String[] args) {
		// new Zhangsan().findLove();
		
		
		try {
			
			Person obj = (Person) new Matchmaker().getInstance(new Zhangsan());
			
			// 这两个方法,你需要代理增强哪种方法 就调用哪个方法
			
			obj.findLove("一见钟情");
			obj.findCompare("适合结婚");
			System.out.println(obj.getClass());  // class sun.proxy.$Proxy0
			
			// 原理:
			// 1.拿到被代理对象的引用,然后获取它的接口
			// 2.jdk代理会重新生成一个类,同时实现我们给的代理对象所实现的接口
			// 3.把我们被代理对象的引用也拿到了
			// 4.重新动态生成一个class字节码
			// 5.然后编译
			
			// 获取字节码内容  使用反编译软件可以查看字节码文件
			byte[] data = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});
			FileOutputStream os = new FileOutputStream("$Proxy0.class");
			os.write(data);
			os.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}
